package at.ac.tuwien.vpsbcm.spielzeugfabrik.gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.UIManager;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;

import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.DefaultComboBoxModel;
import at.ac.tuwien.vpsbcm.spielzeugfabrik.BauteilEnum;
import at.ac.tuwien.vpsbcm.spielzeugfabrik.BauteilTableModel;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.border.TitledBorder;
import javax.swing.JList;
import javax.swing.JSeparator;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.JTable;
import javax.swing.JScrollPane;

/**
 * @author Andreas Wolf
 *
 */

public class GUIMain {

	public JFrame frmGui;
	private JTextField textAnzahl;
	protected JComboBox<BauteilEnum> comboBauteil;
	protected int lastProduzentId;
	protected String GUITitle;
	protected JTable tableBauteile;
	protected BauteilTableModel BauteileTableModelobj;
	protected JList<String> listFertigeLoks;
	protected JList<String> listAusgelieferteLoks;
	protected DefaultListModel<String> FertigeLoksListModelobj;
	protected DefaultListModel<String> AusgelieferteLoksListModelobj;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GUIMain window = new GUIMain();
					window.frmGui.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public GUIMain() {
		this.GUITitle = "Default GUI";
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	protected void initialize() {
		lastProduzentId = 0;
		frmGui = new JFrame();
		frmGui.setTitle(this.GUITitle);
		frmGui.setBounds(100, 100, 500, 300);
		frmGui.setMinimumSize(new Dimension (700, 300));
		frmGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmGui.getContentPane().setLayout(new BorderLayout(0, 0));
		
		JPanel panelNeuerProduzent = new JPanel();
		panelNeuerProduzent.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		frmGui.getContentPane().add(panelNeuerProduzent, BorderLayout.WEST);
		panelNeuerProduzent.setLayout(new FormLayout(new ColumnSpec[] {
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("25dlu:grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("75dlu:grow"),
				FormFactory.RELATED_GAP_COLSPEC,},
			new RowSpec[] {
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.MIN_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,}));
		
		JLabel lblBauteil = new JLabel("Bauteil");
		panelNeuerProduzent.add(lblBauteil, "2, 2, left, center");
		
		comboBauteil = new JComboBox<BauteilEnum>();
		comboBauteil.setModel(new DefaultComboBoxModel<BauteilEnum>(BauteilEnum.values()));
		panelNeuerProduzent.add(comboBauteil, "4, 2, fill, default");
		
		JLabel lblAnzahl = new JLabel("Anzahl");
		panelNeuerProduzent.add(lblAnzahl, "2, 4, left, default");
		
		textAnzahl = new JTextField();
		panelNeuerProduzent.add(textAnzahl, "4, 4, fill, default");
		textAnzahl.setColumns(10);
		
		JButton btnNeuerProduzent = new JButton("Neuer Produzent");
		btnNeuerProduzent.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				try {
					int anzahl;
					try {
						anzahl = Integer.parseInt(textAnzahl.getText());
						textAnzahl.setBackground(UIManager.getColor("TextField.background"));
						
					} catch (NumberFormatException e) {
						textAnzahl.setBackground(Color.RED);
						throw e;
					}
					// wenn wir bis hierher kommen, k�nnen wir den Produzenten starten
					starteProduzent (lastProduzentId, (BauteilEnum)comboBauteil.getSelectedItem(), anzahl);
					lastProduzentId++;
					
				} catch (NumberFormatException e) {
					
					
				}

			}
		});
		panelNeuerProduzent.add(btnNeuerProduzent, "4, 6");
		
		JPanel panelStatus = new JPanel();
		frmGui.getContentPane().add(panelStatus, BorderLayout.CENTER);
		panelStatus.setLayout(new FormLayout(new ColumnSpec[] {
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(100dlu;min):grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				FormFactory.MIN_COLSPEC,
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(50dlu;min):grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				FormFactory.MIN_COLSPEC,
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(50dlu;min):grow"),
				FormFactory.RELATED_GAP_COLSPEC,},
			new RowSpec[] {
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("default:grow"),
				FormFactory.RELATED_GAP_ROWSPEC,}));
		
		JLabel lblBauteile = new JLabel("Bauteile");
		panelStatus.add(lblBauteile, "2, 2, left, default");
		
		JLabel lblFertigeLoks = new JLabel("Fertige Loks");
		panelStatus.add(lblFertigeLoks, "6, 2, left, default");
		
		JLabel lblAusgelieferteLoks = new JLabel("Ausgelieferte Loks");
		panelStatus.add(lblAusgelieferteLoks, "10, 2, left, default");
		
		JSeparator separator1 = new JSeparator();
		separator1.setOrientation(SwingConstants.VERTICAL);
		panelStatus.add(separator1, "4, 2, 1, 3, default, fill");
		
		
		BauteileTableModelobj = new BauteilTableModel ();
		/*BauteileTableModelobj.addRow(new Object [] {1,1,"test","bla",1234});
		BauteileTableModelobj.addRow(new Object [] {1,2,"test2","bla",56});
		BauteileTableModelobj.removeRow(0);
		int row = BauteileTableModelobj.getBauteilRow (1,1);
		BauteileTableModelobj.removeRow(row); */
		
		FertigeLoksListModelobj = new DefaultListModel<String>();
		
		JSeparator separator2 = new JSeparator();
		separator2.setOrientation(SwingConstants.VERTICAL);
		panelStatus.add(separator2, "8, 2, 1, 3, default, fill");
		
		AusgelieferteLoksListModelobj = new DefaultListModel<String>();
		
		JScrollPane scrollPaneBauteile = new JScrollPane();
		panelStatus.add(scrollPaneBauteile, "2, 4, fill, fill");
		tableBauteile = new JTable();
		scrollPaneBauteile.setViewportView(tableBauteile);
		tableBauteile.setEnabled(false);
		tableBauteile.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		tableBauteile.setRowSelectionAllowed(false);
		tableBauteile.setModel(BauteileTableModelobj);
		tableBauteile.getColumnModel().getColumn(0).setPreferredWidth(60);
		tableBauteile.getColumnModel().getColumn(1).setPreferredWidth(60);
		panelStatus.add(tableBauteile.getTableHeader(), "2, 4, 1, 2, fill, fill");
		listFertigeLoks = new JList<String>();
		listFertigeLoks.setModel(FertigeLoksListModelobj);
		listFertigeLoks.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		listAusgelieferteLoks = new JList<String>();
		listAusgelieferteLoks.setModel(AusgelieferteLoksListModelobj);
		listAusgelieferteLoks.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
		
		JScrollPane scrollPaneFertigeLoks = new JScrollPane();
		panelStatus.add(scrollPaneFertigeLoks, "6, 4, fill, fill");
		scrollPaneFertigeLoks.setViewportView(listFertigeLoks);
		
		JScrollPane scrollPaneAusgelieferteLoks = new JScrollPane();
		panelStatus.add(scrollPaneAusgelieferteLoks, "10, 4, fill, fill");
		scrollPaneAusgelieferteLoks.setViewportView(listAusgelieferteLoks);
	}
	protected void starteProduzent(int id, BauteilEnum bauteil, int anzahl) {
		System.out.println("Starte Produzent mit ID" + (id) + ", Bauteil " + (bauteil) + ", Anzahl " + (anzahl));
		// diese Methode wird in der jeweiligen L�sung �berladen
		/*Produzent p;		
		p = new Produzent(lastProduzentId, comboBauteil.getSelectedItem(), anzahl);
		lastProduzentId++;
		Thread t = new Thread(p);
		t.start();
		System.out.println("Start Thread with id" + (lastProduzentId-1));
		*/		
	}
	

}
